/**!
 * 
 * Toast 信息提示 jQuery 插件工具。<br>
 * 由于 IE8 及以下版本作者没测试过，推荐 IE9 以上使用。<br>
 * 
 * 参数说明：
 * 1.top：与顶部的距离。如果不填写，默认值 0px；
 * 2.msg：提示信息。支持换行，建议提示信息不要太长（35 字以内最好），否则会换行；
 * 3.type：提示类型，success-成功；warn-警告；error-错误。如果不填写，默认值 success；
 * 4.close：自动删除的毫秒数。如果不填写，默认值 3000。
 * 
 * 使用示例：
 * 1.成功提示（这是默认提示）：
 * $.toast({
 *		top : 5,
 *		msg : "Toast 成功",
 *		type : "success",
 *		close : 3000
 *	});
 *
 * 2.警告提示：
 * $.toast({
 *		top : 5,
 *		msg : "Toast 警告",
 *		type : "warn",
 *		close : 3000
 *	});
 *
 * 3.错误提示：
 * $.toast({
 *		top : 5,
 *		msg : "Toast 错误",
 *		type : "error",
 *		close : 3000
 *	});
 * 
 * @author ChenYong
 * @date 2016-04-08
 * 
 */



(function($){
	/** 成功提示 */
	var successHtml = "<div class='toast-modal toast-modal-success'>成功提示放在这里！</div>";
	/** 警告提示 */
	var warnHtml = "<div class='toast-modal toast-modal-warn'>警告提示放在这里！</div>";
	/** 错误提示 */
	var errorHtml = "<div class='toast-modal toast-modal-error'>错误提示放在这里！</div>";
	/** 提示模态框的 jQuery 对象 */
	var $toastModal = $(".toast-modal");
	/** Timeout 间隔 ID */
	var timeoutIntervalId = null;
	/** 数字正则表达式 */
	var numberRE = /^[0-9]+$/i;
	
	/**
	 * 
	 * 对象为空。
	 * 
	 * @param o 对象
	 * @returns {Boolean} 是否为空：
	 * <ol>
	 * 	<li>true-为空；</li>
	 * 	<li>false-不为空。</li>
	 * </ol>
	 *  
	 */
	function isNull(o) {
		try {
			if (($.type(o) === "undefined") || (o == null)) {
				return true;
			}
			
			return false;
		} catch (e) {
			return true;
		}
	}
	
	/**
	 * 
	 * 对象不为空。
	 * 
	 * @param o 对象
	 * @returns {Boolean} 是否为空：
	 * <ol>
	 * 	<li>true-不为空；</li>
	 * 	<li>false-为空。</li>
	 * </ol>
	 * 
	 */
	function isNotNull(o) {
		return !isNull(o);
	}
	
	/**
	 * 
	 * 字符串为空。
	 * 
	 * @param str 字符串
	 * @returns {Boolean} 是否为空：
	 * <ol>
	 * 	<li>true-为空；</li>
	 * 	<li>false-不为空。</li>
	 * </ol>
	 *  
	 */
	function isBlank(str) {
		try {
			if (($.type(str) === "undefined") || (str == null) || ($.type(str) !== "string") || ($.trim(str).length === 0)) {
				return true;
			}
			
			return false;
		} catch (e) {
			return true;
		}
	}
	
	/**
	 * 
	 * 字符串不为空。
	 * 
	 * @param str 字符串
	 * @returns {Boolean} 是否为空：
	 * <ol>
	 * 	<li>true-不为空；</li>
	 * 	<li>false-为空。</li>
	 * </ol>
	 * 
	 */
	function isNotBlank(str) {
		return !isBlank(str);
	}
	
	/**
	 * 
	 * 判断变量是否为数字。
	 * 
	 * @param o 变量
	 * @returns {Boolean} 是否为数字：
	 * <ol>
	 * 	<li>true-是；</li>
	 * 	<li>false-否。</li>
	 * </ol>
	 * 
	 */
	function isNumber(o) {
		try {
			return $.isNumeric(o);
		} catch (e) {
			return false;
		}
	}
	
	/**
	 * 
	 * 判断非空变量是否为 jQuery 对象。
	 * 
	 * @param o 变量
	 * @returns {Boolean} 是否为 jQuery 对象：
	 * <ol>
	 * 	<li>true-是；</li>
	 * 	<li>false-否。</li>
	 * </ol>
	 * 
	 */
	function is_jQueryObj(o) {
		try {
			return isNotNull(o) && isNotBlank(o.jquery);
		} catch (e) {
			return false;
		}
	}
	
	/**
	 * 
	 * 显示提示信息。
	 * 
	 */
	$.toast = function(options) {
		// 与顶部的距离
		options.top = (isNull(options.top) ? "0px" : options.top);
		// 提示消息
		options.msg = (isBlank(options.msg) ? "提示" : options.msg);
		// 提示类型
		options.type = (isBlank(options.type) ? "success" : options.type);
		// 自动关闭，默认 3 秒后自动关闭
		options.close = (isNumber(options.close) ? options.close : 3000);
		
		// 修复与顶部的距离
		if (isNumber(options.top)) {
			options.top = options.top + "px";
		} else {
			if (isBlank(options.top)) {
				options.top = "0px";
			} else {
				if (numberRE.test(options.top)) {
					options.top = options.top + "px";
				}
			}
		}
		
		// 修复自动关闭
		if (options.close <= 0) {
			options.close = (3000 - 1000);
		} else if ((options.close > 0) && (options.close <= 2000)) {
			options.close = 1000;
		} else {
			options.close = (options.close - 1000);
		}
		
		// 删除所有提示信息，从而保证共用一个 Toast
		$toastModal.remove();
		
		// 停止上一次的 Timeout
		if (isNotNull(timeoutIntervalId)) {
			clearTimeout(timeoutIntervalId);
		}
		
		// 警告提示
		if (options.type === "warn") {
			$("body").append(warnHtml);
			
			$toastModal = $(".toast-modal-warn");
			
			// 错误提示
		} else if (options.type === "error") {
			$("body").append(errorHtml);
			
			$toastModal = $(".toast-modal-error");
			
			// 成功提示
		} else {
			$("body").append(successHtml);
			
			$toastModal = $(".toast-modal-success");
		}
		
		// 设置 Toast 的信息
		$toastModal.html(options.msg);
		// 设置 Toast 的位置
		$toastModal.css({
			"top" : options.top,
			"left" : (($(window).width() - $toastModal.width()) / 2)
		});
		// 显示 Toast
		$toastModal.show();
		
		// 启动 Timeout
		timeoutIntervalId = setTimeout(function() {
			$toastModal.remove();
		}, options.close);
		
		// 监听当窗口大小改变
		$(window).resize(function(){
			if (is_jQueryObj($toastModal)) {
				$toastModal.css({
					"top" : options.top,
					"left" : (($(window).width() - $toastModal.width()) / 2)
				});
			}
		});
	};
})(jQuery);